<html>
  <head>
    <title></title>
  </head>
  <body>
    <script>
      // 包装书本
      var Book = function(id, bookname, price){
        this.id = id
        this.bookname = bookname
        this.price = price
      }
      Book.prototype.display = function(){
        // 展示这本书的详细信息
        return this.id + '-' + this.bookname + '-' + this.price
      }
      // 或者这样使用，但是两种方式不应该混合使用
      Book.prototype = {
        display: function(){
          // 展示这本书的详细信息
          return this.id + '-' + this.bookname + '-' + this.price
        }
      }
      Book.isJavascriptBook = true
      // 概述：
      // JavaScript是一种基于原型prototype的语言，所以每创建一个对象时（当然在Javascript中函数也是一种对象），
      // 它都有一个原型prototype用于指向其继承的属性、方法。
      var book = new Book(1,'JavaScript设计模式', '50元')
      console.log(book)
      console.log('Book.isJavascriptBook的value:', Book.isJavascriptBook)
      // 实例和构造函数的关系
      // 实例属性__proto__指向构造函数的prototype

      // 一段文字描述__proto__和prototype的关系
      // JavaScript几乎一切皆对象，
      // 1、方法是对象，方法的原型是对象，既然都是对象那么他们肯定有一些一样的特征
      // 即，对象都具有属性__proto__，可称为隐式原型，一个对象的隐式原型指向构造函数的原型，这也保证了实例能够访问在构造函数的原型方法和属性
      
      // 2、方法是特殊的对象，除了和其他对象一样有上述__proto__属性之外，还有自己的特有的属性，还有自己的特有的原型属性（prototype），
      // 这个属性是一个指针，指向一个对象，这个对象的用途就是包含所有实例共享的属性和方法（我们把这个对象叫做原型对象）。原型对象也有一个属性
      // ，叫constructor，这个属性包含一个指针，指回原构造函数
      
      // javascript类静态变量
      // function Book(){}
      // Book.isJavascriptBook = true // 这是类静态变量，只能通过Book来调用，实例对象中不存在
      // Book.getPrice = function(){} // 这是类静态方法，只能通过Book来调用，实例对象中不存在

      
      // 构造函数直接调用，导致this绑定到window了，常见问题
      function User(){
        this.name = '哈哈'
        this.age = 20
      }
      var user = User()
      console.log(user.name, user.age) // undefined undefined
      console.log(window.name, window.age) // '哈哈' 20
      
      // 今天我看了很久的二手iphone，几乎耗费了一整天的时间。
      // 感觉这种行为真的非常值得我反思，为什么我会因为在意这几百块的事情而耗费宝贵的时间去做这种无意义，价值不高的事情。
      // 工资低的离谱，却不知道话更多的时间去学习。提升自身的能力，才能提高自己的生活质量。好了该好好的奋斗了
    </script>
  </body>
</html>